package JavaSE.Class15;

public class exception {
    //    程序先执行 try 中的代码
//    如果 try 中的代码出现异常, 就会结束 try 中的代码, 看和 catch 中的异常类型是否匹配.
//    如果找到匹配的异常类型, 就会执行 catch 中的代码
//    如果没有找到匹配的异常类型, 就会将异常向上传递到上层调用者.
//    无论是否找到匹配的异常类型, finally 中的代码都会被执行到(在该方法结束之前执行).
//    如果上层调用者也没有处理的了异常, 就继续向上传递.
//    一直到 main 方法也没有合适的代码处理异常, 就会交给 JVM 来进行处理, 此时程序就会异常终止.


    public static void main(String[] args) {
        login l=new login();
        l.logining("aaa","111");

    }



    public static int func() {
        try {
            return 10;
        } finally {
            return 20;
        }
    }

    public static void main4() {
        //finally的作用是做善后工作 当出现异常时可以通过finally做
        try{
            test1(10);
            System.out.println("try");
        }catch(ArithmeticException e){
            System.out.println("catch");
            e.printStackTrace();
        }finally {
            System.out.println("finally");
        }
        System.out.println("========");
        System.out.println(func());//return 20
        //不管有没有出现异常最后都会执行finally的代码 不管有没有return 最后也会在finally中return
    }

    public static void main3() {
        int[] arr = {1, 2, 3};
        //出现多种异常时可以用多个catch捕获多个异常
        try {
            System.out.println("before");
            arr = null;
            System.out.println(arr[100]);
            System.out.println("after");
        } catch(ArrayIndexOutOfBoundsException | NullPointerException e){//Exception可以捕获所有异常
            System.out.println("这是个数组有异常");
            e.printStackTrace();
        }

//        catch (ArrayIndexOutOfBoundsException | NullPointerException e) {
//            System.out.println("这是个数组下标越界异常");
//            e.printStackTrace();
//        } catch (NullPointerException e) {
//            System.out.println("这是个空指针异常");
//            e.printStackTrace();
//        }
        System.out.println("after try catch");
    }

    public static void test2(int a)throws RuntimeException{
        if(a==0){
            throw new RuntimeException();
        }
    }
    public static void test1(int a) throws ArithmeticException{
        //throw要new一下
        //throw的类型必须是要exception以及他的子类
        if(a==10){
            throw new ArithmeticException();
        }
    }

    public static void main2() {
        //try内部放可能出现异常的代码
        //catch括号里放可能出现的异常类型或者异常类型的父类 并给一个参数捕获异常
        //若发生了异常 则异常之后的代码不再执行 执行catch并且会继续执行代码（处理异常）
        //若未发生异常则不执行catch的代码
        try{
            test1(10);
            System.out.println("try1");
        }catch(ArithmeticException e){
            //System.out.println(e.getMessage());//null
            //System.out.println(e);//什么异常
            // e.printStackTrace();//最全面的打印异常,在最后打印
            System.out.println("catch1");
        }

        //如果catch的类型与异常类型不匹配则也无法捕获到异常
        try{
            test2(10);
            System.out.println("try2");
        }catch(ArithmeticException e){
            System.out.println("catch2");
        }
    }
    public static void main1() {
        //throw和throws
        //throw是抛出异常  throws是声明有该异常，让程序员做好准备
        test1(10);

    }
}
